#include "sys_task.h"
#include "sys_pub.h"
#include <string.h>

// 系统滴答计数器（10ms为单位，在定时器中断中递增）
 TaskTypeDef* _task_start;
 TaskTypeDef* _task_end;
extern uint32_t get_sys_ms(void);

// 任务框架初始化
void task_list_init(void);
void sys_task_init(void) {
    task_list_init();
    TaskTypeDef* task = _task_start;

    for (; task < _task_end; task++) 
    {
        task->state = TASK_IDLE;
        task->trig_flag = 0;
        task->last_run = 0;
         printf("task init %s \n",task->info.name);
        if( task->info.init) 
        {
             task->info.init();
        }
       
    }
      printf("sys_task_init finish\n");
}

// 任务调度器（在10ms定时器中断中调用）
void sys_task_scheduler(void) {
    TaskTypeDef* task = _task_start;
    uint16_t current_tick = sys_get_tick_ms();

    for (; task < _task_end; task++) {
        // 外部触发优先
        if (task->trig_flag) {
            task->state = TASK_RUNNING;
            task->info.func();  // 调用任务函数
            task->last_run = current_tick;
            task->trig_flag = 0;
            task->state = TASK_IDLE;
            continue;
        }

        // 周期任务处理（period=0表示仅触发）

            uint16_t interval = (current_tick >= task->last_run) ? 
                               (current_tick - task->last_run) : 
                               (current_tick + (0xFFFF - task->last_run));

            if (interval >= task->period) {
                task->state = TASK_RUNNING;
                task->info.func();
                task->last_run = current_tick;
                task->state = TASK_IDLE;
            }
        
    }
}

// 通过任务名触发任务
uint8_t sys_task_trigger_by_name(const char* task_name)
 {
    TaskTypeDef* task = _task_start;
    for (; task < _task_end; task++) {
        if (strcmp(task->info.name, task_name) == 0) {
            task->trig_flag = 1;
            return 1;
        }
    }
    return 0;
}

// 直接通过任务指针触发任务
void sys_task_trigger(TaskTypeDef* task) {
    if (task >= _task_start && task < _task_end) {
        task->trig_flag = 1;
    }
}

// 动态修改任务周期（新增功能）
void sys_task_set_period(TaskTypeDef* task, uint16_t new_period) {
    if (task >= _task_start && task < _task_end) {
        task->period = new_period;  // 直接修改RAM中的周期值
    }
}
